package com.bgi.uims.module.sys.menu.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.bgi.uims.common.dao.ICommonDao;
import com.bgi.uims.common.dto.PageVo;
import com.bgi.uims.module.sys.menu.dto.Menu;
import com.bgi.uims.module.sys.menu.service.MenuService;
import com.bgi.uims.module.sys.role.dto.SysRoles;
import com.bgi.uims.module.sys.user.dto.User;
import com.bgi.uims.pub.utils.Constant;

/**
 * 
 * ClassName:MenuService 
 * Function: TODO 
 * Reason:	 TODO 
 * @CreateDate:2015年3月24日 下午5:57:46
 * @author   fanqh
 * @version  
 * @since    JDK 1.7
 * @see
 */
@Service
@Transactional
public class MenuService {

	@Resource
	private ICommonDao commonDao;
	
	/**
	 * 
	 * @Description： 菜单管理，加载所以菜单信息,如果有不希望出现的，id号放到excluedId
	 * @author: WEN
	 * @CreateDate:2015年3月25日 上午10:24:21
	 * @version: V1.0
	 */
	@SuppressWarnings("unchecked")
	public PageVo menusTree(Menu menu) {
		PageVo pageVo = new PageVo();
		//查询所有的根节点菜单
		menu.setQuerySql(Constant.SQL_QUERY_ALLMENU);
		List<Menu> menus = commonDao.query(menu).getRows();
		List<Menu> root=new ArrayList<Menu>();
		if(menus!=null&&menus.size()>0)
		{
			for(Menu m:menus)
			{
				if("menuRoot".equals(m.getParentId().trim()))
				{
					m.setChildren(menuFilter(menus, m.getId()));
					m.setParentId(m.getParentId().trim());
					root.add(m);
				}
			}
		}
		menu.setId("menuRoot");
		menu.setText("菜单管理");
		menu.setChildren(root);
		List<Menu> lastMenus = new ArrayList<Menu>();
		lastMenus.add(menu);
		pageVo.setRows(lastMenus);
		return pageVo;
	}
	
	/**
	 * 
	 * @Description：  //根据用户加载菜单
	 * @author: WEN
	 * @CreateDate:2015年3月30日 下午3:38:50
	 * @version: V1.0
	 */
	public List<Menu> buildMenus(User user) {
		//查询所有的根节点菜单
		List<Menu> root=new ArrayList<Menu>();
		user.setQuerySql(Constant.SQL_QUERY_USERMENU);
		@SuppressWarnings("unchecked")
		List<Menu> menus = commonDao.query(user).getRows();
		if(menus!=null&&menus.size()>0)
		{
			for(Menu m:menus)
			{
				if("menuRoot".equals(m.getParentId().trim()))
				{
					m.setChildren(menuFilter(menus, m.getId()));
					m.setParentId(m.getParentId().trim());
					root.add(m);
				}
			}
		}
		return root;
	}
	
	/**
	 * 
	 * @Description：  //根据用户加载菜单。。将菜单的信息体现父子关系
	 * @author: WEN
	 * @CreateDate:2015年3月30日 下午3:38:50
	 * @version: V1.0
	 */
	public List<Menu> menuFilter(List<Menu> menu,String parentId){
		List<Menu> trees = new ArrayList<Menu>();
		for(Menu p : menu){
			if(parentId.equals(p.getParentId())){
				p.setChildren(menuFilter(menu,p.getId()));
				trees.add(p);
			}
		}
		return  trees;
	}
	
	/**
	 * 
	 * @Description：  菜单管理，添加菜单
	 * @author: WEN
	 * @CreateDate:2015年3月25日 上午11:01:57
	 * @version: V1.0
	 */
	public boolean saveMenu(Menu menu) {
		boolean bool=false;
		if (menu.getId() == null || "".equals(menu.getId())){
			menu.setInsertSql(Constant.SQL_INSERT_MENU);
			String menuId = (String) commonDao.insert(menu);
			if(menuId!=null)
			{
				bool=true; 
			}
		} else {
			menu.setUpdateSql(Constant.SQL_UPDATE_MENU);
			Integer count = commonDao.update(menu);
			if (count == 1){
				bool=true; 
			}
		}
		return bool;
	}

	/**
	 * 
	 * @Description：  通过ID号查询菜单信息
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午12:37:36
	 * @version: V1.0
	 */
	public Menu queryMenuById(Menu menu) {
		menu.setQueryOneSql(Constant.SQL_QUERY_MENUBYID);
		menu=(Menu) commonDao.queryOne(menu);
		return menu;
	}
	/**
	 * 
	 * @Description：  删除菜单，需要判断是否还有资源，有的话，就不删除，返回错误信息
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午12:53:34
	 * @version: V1.0
	 */
	public String deleteMenu(Menu menu) {
		String resultMsg = null;
		menu.setQueryOneSql(Constant.SQL_QUERY_MENURESOURCECOUNT);
		Integer count = (Integer) commonDao.queryOne(menu);
		if(count == 0){
			//删除菜单前，先删除菜单和角色的授权
			menu.setDeleteSql(Constant.SQL_DELETE_MENU_ROLE);
			commonDao.delete(menu);
			menu.setDeleteSql(Constant.SQL_DELETE_MENU);
			commonDao.delete(menu);
			return resultMsg;
		} else {
			return Constant.ERROR_CODE_104;
		}
	}

	
	public PageVo queryResource(Menu menu) {
		menu.setQuerySql(Constant.SQL_QUERY_RESOURCE);
		//未设置页码，默认不分页
		PageVo page=commonDao.query(menu);
		return page;
	}

	/**
	 * 
	 * @Description： 添加或更新资源。
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午1:47:13
	 * @version: V1.0
	 */	
	public boolean addResource(
			com.bgi.uims.module.sys.menu.dto.Resource resource) {
		boolean bool=false;
		if(resource.getResourceId() != null && 
				!"".equals(resource.getResourceId())){
			resource.setUpdateSql(Constant.SQL_UPDATE_RESOURCE);
			Integer count = commonDao.update(resource);
			if(count == 1)
			{
				bool=true; 
			}
		} else {
			resource.setInsertSql(Constant.SQL_INSERT_RESOURCE);
			String newsId = (String) commonDao.insert(resource);
			if(newsId!=null)
			{
				bool=true; 
			}
		}
		return bool;
	}

	/**
	 * 
	 * @Description：  删除资源
	 * @author: WEN
	 * @CreateDate:2015年3月25日 下午1:50:09
	 * @version: V1.0
	 */
	public boolean deleteResource(
			com.bgi.uims.module.sys.menu.dto.Resource resource) {
		//删除角色-资源中间表
		resource.setDeleteSql(Constant.SQL_DELETE_RESOURCE_ROLE);
		commonDao.delete(resource);
		//删除资源
		resource.setDeleteSql(Constant.SQL_DELETE_RESOURCE);
		commonDao.delete(resource);
		return true;
	}

	/**
	 * 
	 * @Description：   通过ID号查询资源
	 * @author: WEN
	 * @CreateDate:2015年3月26日 下午5:05:07
	 * @version: V1.0
	 */
	public com.bgi.uims.module.sys.menu.dto.Resource queryResourceById(
			com.bgi.uims.module.sys.menu.dto.Resource resource) {
		resource.setQueryOneSql(Constant.SQL_QUERY_RESOURCEBYID);
		resource=(com.bgi.uims.module.sys.menu.dto.Resource) commonDao.queryOne(resource);
		return resource;
	}

	/**
	 * 
	 * @Description： 角色菜单授权，加载角色授权信息及菜单
	 * @author: WEN
	 * @CreateDate:2015年3月25日 上午10:24:21
	 * @version: V1.0
	 */
	public PageVo menusTree(SysRoles role) {
		PageVo pageVo = new PageVo();
		//查询所有的根节点菜单
		role.setQuerySql(Constant.SQL_QUERY_MENU_BYROLE);
		@SuppressWarnings("unchecked")
		List<Menu> menus = commonDao.query(role).getRows();
		List<Menu> root=new ArrayList<Menu>();
		if(menus!=null&&menus.size()>0)
		{
			for(Menu m:menus)
			{
				if("menuRoot".equals(m.getParentId().trim()))
				{
					m.setChildren(menuFilter(menus, m.getId()));
					m.setParentId(m.getParentId().trim());
					root.add(m);
				}
			}
		}
		pageVo.setRows(root);
		return pageVo;
	}

	/**
	 * 
	 * @Description：  查询资源，根据选择的角色，和菜单   不分页
	 * @author: WEN
	 * @CreateDate:2015年3月26日 下午5:06:49
	 * @version: V1.0
	 */
	
	public PageVo findRoleResource(Menu menu) {
		menu.setQuerySql(Constant.SQL_QUERY_ROLE_RESOURCE);
		//未设置页码，默认不分页
		PageVo page=commonDao.query(menu);
		return page;
	}

	/**
	 * 
	 * @Description：  保存角色和菜单授权配置
	 * @author: WEN
	 * @CreateDate:2015年3月27日 上午9:30:45
	 * @version: V1.0
	 */
	
	public String saveAuthorizationMenu(Menu menu) {
		String msg = "";
		//角色菜单处理
		if(menu.getId()!=null)
		{
			menu.setIds(menu.getId().trim().split(","));
		}
		//查询该角色的原本菜单配置信息
		SysRoles role = new SysRoles();
		role.setRolesId(menu.getRolesId());
		role.setQuerySql(Constant.SQL_QUERY_MENU_BYROLE);
		@SuppressWarnings("unchecked")
		List<Menu> oldRoleMenus = commonDao.query(role).getRows();
		//查询修改角色的菜单配置信息
		menu.setQuerySql(Constant.SQL_QUERY_MENU_BYIDS);
		@SuppressWarnings("unchecked")
		List<Menu> newRoleMenus = commonDao.query(menu).getRows();
		//删除
		menu.setDeleteSql(Constant.SQL_DELETE_ROLEPURVIEWS);
		commonDao.delete(menu);
		menu.setInsertSql(Constant.SQL_INSERT_ROLEPURVIEWS);
		commonDao.insert(menu);
		
		//对修改进行比较，比较信息放到历史记录里，保存到操作日志里。
		Map<String,String> extendHistory = new HashMap<String,String>();
		StringBuilder deleteMenu = new StringBuilder();
		StringBuilder addMenu = new StringBuilder();
		for(Menu newRoleMenu:newRoleMenus){
			boolean addFlag = true;
			for(Menu oldRoleMenu:oldRoleMenus){
				if(oldRoleMenu.isChecked() && newRoleMenu.getId().equals(oldRoleMenu.getId())){
					addFlag = false;
					break;
				}
			}
			if(addFlag){
				addMenu.append(newRoleMenu.getText()+",");
			}
		}
		for(Menu oldRoleMenu:oldRoleMenus){
			if(oldRoleMenu.isChecked()){
				boolean deleteFlag = true;
				for(Menu newRoleMenu:newRoleMenus){
					if(newRoleMenu.getId().equals(oldRoleMenu.getId())){
						deleteFlag = false;
						break;
					} 
				}
				if(deleteFlag){
					deleteMenu.append(oldRoleMenu.getText()+",");
				}
			}
		}
		extendHistory.put("extends", "false");
		extendHistory.put("object","角色");//必须有,对象描述
		extendHistory.put("table","sys_roles");//必须有,表名描述
		extendHistory.put("tableId",menu.getRolesId());//必须有,表名描述
		extendHistory.put("describe","角色的菜单授权");//必须有,可以指定到具体某一条，即该条的独有特性,可以描述此记录
		extendHistory.put("删除菜单权限，菜单名称", deleteMenu.toString());
		extendHistory.put("添加菜单权限，菜单名称", addMenu.toString());
		menu.setSpecialHistory(extendHistory);
		return msg;
	}

	/**
	 * 
	 * @Description：  保存角色和资源授权配置
	 * @author: WEN
	 * @CreateDate:2015年3月27日 上午9:42:22
	 * @version: V1.0
	 */
	
	public String saveAuthorizationResource(
			com.bgi.uims.module.sys.menu.dto.Resource resource) {
		String msg = "";
		//角色菜单处理
		if(resource.getResourceId()!=null)
		{
			resource.setResourceIds(resource.getResourceId().trim().split(","));
		}
		//先查询出该角色之前的资源配置信息
		Menu menu = new Menu();
		menu.setRolesId(resource.getRolesId());
		menu.setId(resource.getMenuId());
		menu.setQuerySql(Constant.SQL_QUERY_ROLE_RESOURCE);
		@SuppressWarnings("unchecked")
		List<com.bgi.uims.module.sys.menu.dto.Resource> oldResources = commonDao.query(menu).getRows();
		//查出角色修改资源配置的信息
		resource.setQuerySql(Constant.SQL_QUERY_RESOURCE_BYIDS);
		@SuppressWarnings("unchecked")
		List<com.bgi.uims.module.sys.menu.dto.Resource> newResources = commonDao.query(resource).getRows();
		//删除
		resource.setDeleteSql(Constant.SQL_DELETE_ROLERESOURCE);
		commonDao.delete(resource);
		resource.setInsertSql(Constant.SQL_INSERT_ROLERESOURCE);
		commonDao.insert(resource);
		
		//对修改进行比较，比较信息放到历史记录里，保存到操作日志里。
		Map<String,String> extendHistory = new HashMap<String,String>();
		StringBuilder deleteMenu = new StringBuilder();
		StringBuilder addMenu = new StringBuilder();
		for(com.bgi.uims.module.sys.menu.dto.Resource newResource:newResources){
			boolean addFlag = true;
			for(com.bgi.uims.module.sys.menu.dto.Resource oldResource:oldResources){
				if(oldResource.isChecked() && newResource.getResourceId().equals(oldResource.getResourceId())){
					addFlag = false;
					break;
				}
			}
			if(addFlag){
				addMenu.append(newResource.getResourceName()+",");
			}
		}
		for(com.bgi.uims.module.sys.menu.dto.Resource oldResource:oldResources){
			if(oldResource.isChecked()){
				boolean deleteFlag = true;
				for(com.bgi.uims.module.sys.menu.dto.Resource newResource:newResources){
					if(newResource.getResourceId().equals(oldResource.getResourceId())){
						deleteFlag = false;
						break;
					} 
				}
				if(deleteFlag){
					deleteMenu.append(oldResource.getResourceName()+",");
				}
			}
		}
		extendHistory.put("extends", "false");
		extendHistory.put("object","角色");//必须有,对象描述
		extendHistory.put("table","sys_roles");//必须有,表名描述
		extendHistory.put("tableId",menu.getRolesId());//必须有,表名描述
		extendHistory.put("describe","角色的资源授权");//必须有,可以指定到具体某一条，即该条的独有特性,可以描述此记录
		extendHistory.put("取消资源权限，资源名称", deleteMenu.toString());
		extendHistory.put("添加资源权限，资源名称", addMenu.toString());
		resource.setSpecialHistory(extendHistory);
		return msg;
	}

	/**
	 * 
	 * @Description：  查询用户不能看到的资源信息
	 * @author: WEN
	 * @CreateDate:2015年4月9日 下午2:38:22
	 * @version: V1.0
	 */
	public PageVo disabledResource(User user) {
		// TODO Auto-generated method stub
		user.setQuerySql(Constant.SQL_QUERY_DISABLEDRESOURCEBYUSERID);
		PageVo page=commonDao.query(user);
		return page;
	}
}

